package 力扣91;

import java.util.Stack;

/**
 * @ClassName : Day4_394_字符串解码_lc题解_没看懂3
 * @Author : 骆发茂
 * @Date: 2021/12/15 22:48
 * @Description :
 * https://leetcode-cn.com/problems/decode-string/solution/javayi-ge-zhan-jian-ji-qing-xi-jie-jue-wen-ti-by-c/
 */
public class Day4_394_字符串解码_lc题解_没看懂3 {
    class Solution {
        public String decodeString(String s) {
            int len=s.length();
            if(len<=0) return "";
            Stack<String> stack=new Stack<>();
            for(int i=0; i<len; i++){
                char mid=s.charAt(i);
                /*读到]时，用一个while循环将[和]之间的字符串读出，
                我这里用了StringBuilder来提高字符串拼接性能，读出后将[pop删去，
                然后开始读数字num了，注意数字可能是很多位数字，这里处理方法很多，
                我就直接用parseInt将字符串转化为数字了，然后是将上述字符串复制num倍，
                这样处理后再将字符串放回栈中即可，至于其他情况，直接将其转化为字符串压入栈中即可，
                最后出栈的时候要注意，字符串的总体顺序是反的，故要用insert拼接而不是append
*/

                //读到]时，用一个while循环将[和]之间的字符串读出，
                if(mid==']'){
                    StringBuilder fir=new StringBuilder();
                    while(!stack.peek().equals("[")){
                        fir.insert(0,stack.pop());
                    }
                    //读出后将[pop删去，
                    stack.pop();

                    StringBuilder num=new StringBuilder();

                    /*然后开始读数字num了，注意数字可能是很多位数字，这里处理方法很多，
                    我就直接用parseInt将字符串转化为数字了*/
                    while(!stack.isEmpty()&&(stack.peek().charAt(0)>='0'&&stack.peek().charAt(0)<='9')){
                        num.insert(0,stack.pop());
                    }
                    int number=Integer.parseInt(num.toString());

                    //，然后是将上述字符串复制num倍，这样处理后再将字符串放回栈中即可
                    StringBuilder sec=new StringBuilder();
                    for(int j=0; j<number; j++){
                        sec.append(fir);
                    }
                    stack.push(sec.toString());
                }
                //至于其他情况，直接将其转化为字符串压入栈中即可
                else{
                    StringBuilder sb=new StringBuilder();
                    sb.insert(0,mid);
                    stack.push(sb.toString());
                }
            }

            //最后出栈的时候要注意，字符串的总体顺序是反的，故要用insert拼接而不是append
            StringBuilder res=new StringBuilder();
            while(!stack.isEmpty()){
                res.insert(0,stack.pop());
            }
            return res.toString();
        }
    }

}